package com.wc.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串工具类
 * 
 * @author ysh
 */
public class StringUtils {

	/**
	 * 判断对象是否为空
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj)
	{
		if (obj == null)
		{
			return true;
		}
		if ((obj instanceof List))
		{
			return ((List) obj).size() == 0;
		}
		if ((obj instanceof String))
		{
			return ((String) obj).trim().equals("");
		}
		return false;
	}

	/**
	 * 判断字符串是否为空
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(final String str) {
		// 判断一个String类型为空，无疑就是判断是否==null或长度是否==0或内容是否为""
		return (str == null) || (str.length() == 0) || ("".equals(str));
	}

	/**
	 *   * 判断多个字符串全部是否为空   * @param strings   * @return   
	 */
	public static boolean isAllEmpty(String... strings) {
		// 如果它等于空那么就返回true
		if (strings == null) {
			return true;
		}
		// 遍历所有String类型参数
		for (String str : strings) {
			if (!isEmpty(str)) {
				return false;
			}
		}
		return true;

	}

	/**
	 * 去字符串头尾空格
	 * 
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		return str == null ? "" : str.trim();
	}

	/**
	 * 截取字符串
	 * 
	 * @param str
	 * @param start
	 * @param end
	 * @return
	 */
	public static String substring(final String str, int start, int end) {
		if (str == null) {
			return "";
		}
		if (end < 0) {
			end = str.length() + end;
		}
		if (start < 0) {
			start = str.length() + start;
		}
		if (end > str.length()) {
			end = str.length();
		}
		if (start > end) {
			return "";
		}
		if (start < 0) {
			start = 0;
		}
		if (end < 0) {
			end = 0;
		}
		return str.substring(start, end);
	}

	/**
	 * 字符串分割，如果分隔符在首位，在splitChar为false时，首位的空将被忽略。这是和jdk中string的split的区别
	 * 
	 * @param input     待分割的字符串
	 * @param regex     字符串的分割标记，正则表达式
	 * @param splitChar 是否包含分割标记，默认为不包含
	 * @param isAfter   分割标记附加在截取字符串的前面还是后面，默认前面
	 * @return List<String>字符串列表
	 */
	private static List<String> split(String input, String regex, boolean splitChar, boolean isAfter) {
		List<String> list = new ArrayList<String>();
		if (null == input || "".equals(input)) {
			return list;
		}
		int beginIndex = 0;
		int length = input.length();
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(input);
		while (matcher.find()) {
			int matcherStart = matcher.start();
			int matcherEnd = matcher.end();
			String ele = "";
			if (splitChar && isAfter) {
				ele = input.substring(beginIndex, matcherEnd);
			} else {
				ele = input.substring(beginIndex, matcherStart);
			}
			// if包含分割符，else不包含分割符
			if (splitChar) {
				if (isAfter) {
					beginIndex = matcherEnd;
				} else {
					beginIndex = matcherStart;
				}
			} else {
				beginIndex = matcherEnd;
			}
			// 如果分隔符在字符序列的头位置，就忽略。这是java正则表达式本身的分割机制所致。
			if (0 == matcherStart && false == isAfter) {
				continue;
			}
			list.add(ele);
		}
		if (beginIndex < length) {
			list.add(input.substring(beginIndex));
		}
		return list;
	}

	/**
	 * 字符串分割
	 * 
	 * @param input     待分割的字符串
	 * @param regex     字符串的分割标记，正则表达式
	 * @param splitChar 是否包含分割标记，默认为不包含
	 * @return List<String>字符串列表
	 */
	private static List<String> split(String input, String regex, boolean splitChar) {
		return split(input, regex, splitChar, false);
	}

	/**
	 * 字符串分割
	 * 
	 * @param input 待分割的字符串
	 * @param regex 字符串的分割标记，正则表达式
	 * @return List<String>字符串列表
	 */
	public static List<String> split(String input, String regex) {
		return split(input, regex, false);
	}

}
